perm filename LONGLN[E,ALS]1 blob sn#183448 filedate 1975-10-31 generic text, type T, neo UTF8
;NEWDIR, NEWDLP, SKPDSP, NEWDFF, OPUT, OSET, TMPDIR

NEWDIR:	MOVEI DSP,SKPDSP
	MOVSI H,LSPC+NSPEC
	MOVE G,INPNT
NEWDLP:	GETCH2 H,G
	GETCH2 H,G
	JRST NEWDLP

SKPDSP:	JSP C,RDLNUL		;NUL
	PUSHJ P,RLD		;RUBOUT
	JRST NEWDLP		;CR
	JRST NEWDLP		;LF
	JRST NEWDLP		;TAB
	JRST NEWDFF		;FF
	JRST NEWDLP		;ALT

NEWDFF:	SKIPE @DSTFIL+4
	JRST MAKDR0
	SKIPA T,IBLK
	PUSHJ P,WRBUF
	SOJG T,.-1
	JRST MAKDR0

OPUT:	PUSHJ P,WRBUF
OSET:	MOVN A,OCNT
	HRLI B,(A)
	MOVE A,OPNT
	POPJ P,

;Code to handle long lines
LONGLN:	SKIPE RDLNGF#
	JRST LONGLX		;Put a CRLF here
	SETZM TYOPNT
	OUTSTR [ASCIZ/
Line /]
	TYPDEC LINES
	OUTSTR [ASCIZ/ on Page /]
	TYPDEC CURPAG
	OUTSTR [ASCIZ / is too long./]
	TRNE F,REDNLY		;Are we in readonly?
	JRST LONGLX		;Yes
	OUTSTR [ASCIZ/ Type Y to continue in READONLY mode
with this and all subsequent long lines split at approx. 500 characters. /]
	PUSHJ P, YESCHK
	JRST LONGLY
	OUTSTR [ASCIZ/Will you settle for splitting this line only?  /]
	JRST LONGLZ
	FATAL LINE MORE THAN 511 CHARS
LONGLY:	SETOM RDLNGF		;Set bypass flag
	SETOM RDONLY
	TRO F,REDNLY
LONGLZ:	OUTSTR [ASCIZ/WARNING - Lines longer than 120 characters can not be edited.
They may, however be broken up by XJUST or JFILL commands./]
LONGLX:	TRO F,WRITE		;Core image will differ from disk
	MOVSI I,-=498
	MOVEI C,15
	JRST @2(DSP)
	JRST RDLCR1		;Insert a CRLF and procede
;MAKDIR, MAKDR0, MAKDR1, MAKDOL, MDOL1

MAKDIR:	MOVE G,INPNT
	MOVEI C,14
MAKDR0:	PUSHJ P,FLSDIR
	SKIPE @DSTFIL+4
	JRST MAKDR1
	MOVE T,[DIR,,DIREND]
	PUSHJ P,DIRAD1
	MOVNI T,=12
	ADDM T,DIRSIZ	;DON'T COUNT THIS TWICE
	MOVEI T,1
	MOVEM T,1(A)
	SKIPA D,A
MAKDR1:	MOVEI D,DIR
	PUSHJ P,ENDSET
	MOVE E,FSEND
MAKDOL:	PUSHJ P,OSET
	HRRI B,
	SKIPN PAGES
	JRST MDOL1
	IDPB C,A
	AOBJN B,.+2
	PUSHJ P,OPUT
	MOVSI I,-=498		;Long line counter
MDOL1:	MOVEI E,1(E)
	HRRM E,(D)
LEG	HRLZM D,(E)
	MOVEI D,(E)
	MOVE T,OBLK
LEG	MOVEM T,1(D)
	ADD E,[350700,,LPDESC]
	MOVSI T,(<BYTE (7)11>)
LEG	MOVEM T,(E)
	HRRI B,1
	MOVSI H,LSPC+DSPC+NSPEC
	MOVEI DSP,MD1DSP		;Dispatch table on page 119
	MOVSI I,-=498			;To count characters for long line test
	SETZM LINES			;So we can report line number if too long
	MOVE T,[440700,,T]
	MOVEM T,INPNT
	SETZM FFLINE#			;Count lines on this page for /F.
	SETZB T,TT
	JSP Q,SOSCHK
;MDIL1, MDIL1A, MDIL2, MDIL2A, MDCSRC, MDCSR1, MD1DSP

MDIL1:	GETCH2 H,G
	IDPB C,A
	AOBJP I,LONGLN		;Time for a long-line break
	AOBJN B,.+2
	PUSHJ P,OPUT
LEG	IDPB C,E
	CAIL C,140
	SUBI C,40
	IDPB C,INPNT
	CAIG C,40
	JRST MDCSRC
;	TRNN B,-10	;REPLACED BY
;	JRST MDIL1	; " "
	PUSH P,C	;YOU HAVE ANOTHER AC?  THEN WE CAN TALK.
	HRRZ C,B	;THIS ALL MAKES SURE SYMBOL IS SHORT ENUF, THEN COMPARES AGAINST
	CAIG C,13	;A LIST OF "COMMENT" AND "SUBTTL" TO REMOVE THEM FROM DIR PAGE.
	JRST [ POP P,C ↔ JRST MDIL1 ]
	POP P,C
MDIL1A:	MOVEI DSP,MD2DSP		;Also set to this table on page 118
	MOVEI T,MD2CR
	MOVEM T,INPNT
MDIL2:	GETCH2 H,G
LEG	IDPB C,E
MDIL2A:	IDPB C,A
	AOBJP I,LONGLN		;Time for a long-line break
	AOBJN B,MDIL2
	PUSHJ P,OPUT
	JRST MDIL2

MDCSRC:	PUSHJ P,MDCSR1
	JUMPGE DSP,MDIL1A
	MOVSI E,350700
	HRRI E,LPDESC(D)
	HRRI B,400001
	JRST MDIL1A

MDCSR1:	MOVSI DSP,-NSCOMS
	DPB DSP,INPNT
	CAMN T,SCOMS(DSP)
	CAME TT,SCOMS2(DSP)
	AOBJN DSP,.-2
	POPJ P,

MD1DSP:	JSP C,RDLNUL		;NUL
	PUSHJ P,RLD		;RUBOUT
	JRST MD1CR		;CR
	JRST MAKDLF		;LF
	JFCL			;TAB
	JRST MDFF1		;FF
	MOVEI C,"}"		;ALT
	PUSHJ P,TELL7		;Letter
	JRST MDIL1B		;⊗
;MDIL1B, MAKDLF, MAKDFF, MDFF2, MDFF3, MDCEOL, MD2DSP

MDIL1B:	IDPB C,A
	AOBJN B,.+2
	PUSHJ P,OPUT
	SOJA B,MDIL1

MAKDFF:	TRNN B,-2
	JRST MDFF2
	SETZM LINES			;Start count over on new page
MAKDLF:	ADD G,[70000,,]
	MOVEI C,15
	JRST @2(DSP)

MDFF1:	TRNE B,-2
	JRST MAKDLF
	MOVEI C,15
	PUSHJ P,MDFIX
MDFF4:	MOVEI C,14
MDFF2:

;Here we check to see if it is indeed safe to reformat the file
	TRNN F,REDNLY			;Are we in read only
	SKIPE RLDFLG#			;Has the test been made yet
	JRST .+2			;Yes
	PUSHJ P, RLDCHK			;No, so make test


	JUMPE A,MDFF3
	MOVEM A,OPNT
	MOVE A,D
	PUSHJ P,CLOSO
	MOVE D,A
MDFF3:	TRNN F,EOF
	JRST MAKDOL
	MOVE T,OBLK
	MOVEM T,DIREND+1
	PUSHJ P,GDIRX
	TRO F,DIROK
	TRZ F,FILLUZ
	SKIPN @DSTFIL+4
	TRO F,UPDTXT
	JRST COPYX

MDCEOL:	PUSHJ P,MDCSR1
	TRNE B,-2
	JUMPGE DSP,CPOPJ
	MOVSI E,440700
	HRRI E,LPDESC(D)
	HRRI B,
	POPJ P,

MD2DSP:	JSP C,RDLNUL		;DSP set for this dispatch table on page 121
	PUSHJ P,RLD		;RUBOUT
	JRST @INPNT		;CR
	JRST MAKDLF		;LF
	JFCL			;TAB
	JRST MAKDFF		;FF
	MOVEI C,"}"		;ALT	
	PUSHJ P,TELL7		;LETTER
	SOJA B,MDIL2A		;⊗

;Here we check to see if it is really safe to complete the formatting of the
;file being loaded.

RLDCHK:	SETZM TYOPNT		;Test last time always
	MOVE T,RLDRUB
	JUMPN T,RLDCK2
	SKIPN T,SOSBIN
	POPJ P,			;Seems to be a normal source file
	SETOM RLDFLG		;Inhibit further questions
	SUB T,SOSPAG
	SUB T,SOSLIN
	JUMPN T,RLDCK2		;Not a simple SOS file

	OUTSTR [ASCIZ /
You are formatting an SOS file
/]
RLDCK1:	HRRZ T,EDFIL+3		;Get file PN
	SKIPN T			;If no PPN check alias
	HRRZ T,PPN
	PUSH P,A
	HRRZ A,RPPN		;Check with users name
	CAME T,A
	JRST .+3		;Ask a question
	POP P,A
	POPJ P,			;OK
	OUTSTR [ASCIZ /Are you sure that /]
	PUSH P,B
	PUSH P,C
	HRLZ A,T
	PUSHJ P,PNTYO
	POP P,C
	POP P,B
	POP P,A
	OUTSTR [ASCIZ / will approve? (Y or N) /]
	PUSHJ P,YESCHK
	POPJ P,
RLDCKX:	MOVE P,[-70,,PDL]
	PUSHJ P,ENDFIX
	PUSHJ P,FLSDIR
	JRST FORMT4

	SETZM DIRPT
	SETZM DIRP1
	PUSHJ P,ENDSET
	JRST FORMT4

	
RLDCK2:	SETOM RLDFLG
	MOVE T,SOSLI2
	JUMPN T,RLDCK3
	SKIPN RLDRUB
	POPJ P,
	OUTSTR [ASCIZ /
This file has several special symbols and is probably an XGP or binary file.
Do you really want to garbage it? (Y or N) /]
	SKIPA
RLDCK3:	OUTSTR [ASCIZ /
This may be a binary file that would be hopelessly garbaged by formatting.
Do you really want to format it (Y or N)? /]
	SETOM RLDFLG
RLDASK:	PUSHJ P,YESCHK
	JRST RLDCK1
	JRST RLDCKX
;MD1CR, MD2CR, MD3CR, MD3CR1, MDIL3, MDCRCK, MDFIX, MDLFCK

MD1CR:	IBP INPNT
	PUSHJ P,MDCEOL
MD2CR:	PUSHJ P,MDFIX
	MOVSI H,LSPC+NSPEC
	MOVEI T,MD3CR
	MOVEM T,INPNT
MD3CR:	IDPB C,A
	AOBJN B,.+2
	PUSHJ P,OPUT
	MOVEI C,12
	IDPB C,A
	AOS LINES
	MOVSI I,-=498
	AOBJN B,.+2
	PUSHJ P,OPUT
	HRRI B,1
	SKIPE EDFIL-2		;Are we inserting FFs for /F mode?
	JRST MD4CR
MD4CR0:	SKIPA DSP,[MDCRCK]	;Table below
MD3CR0:	MOVEI DSP,MD2DSP	;Table on page 120
MD3CR1:	GETCH2 H,G
	MOVEI DSP,MD2DSP
	JSP Q,SOSCK2
MDIL3:	GETCH2 H,G
	IDPB C,A
	AOBJP I,LONGLN
	AOBJN B,MDIL3
	PUSHJ P,OPUT
	JRST MDIL3

MD4CR:	AOS DSP,FFLINE		;Count another line on this page.
	CAMGE DSP,EDFIL-2	;Time to insert another FF?
	JRST MD4CR0		;No.
	MOVEI DSP,MDLFCK
	GETCH2 H,G
	CAIE C,12		;Is this the LF we expected?
	JRST MD5CR
	GETCH2 H,G		;Get first character following the CRLF.
MD5CR:	ADD G,[070000,,0]	;Back up byte pointer to save char for next time.
	JRST MDFF4		;Go insert FF.

MDLFCK:	JSP C,RDLNUL
	PUSHJ P,RLD
	JFCL
	JFCL			;LF
	JFCL
	JRST MDFF2		;Got a real FF.
	MOVEI C,"}"

MDCRCK:	JSP C,RDLNUL
	PUSHJ P,RLD
	JRST MD3CR1
	JRST MD3CR0
	JFCL
	JRST MDFF2
	MOVEI C,"}"

MDFIX:	MOVEI T,12
LEG	IDPB C,E
LEG	IDPB T,E
	MOVEI T,177
LEG	IDPB T,E
	ADDI E,2
	MOVSI T,DIRCOD
	FSFIX E,T
	LDB T,[2100,,B]
	ADDI T,2
	MOVEM T,2(D)
	ADDM T,DIRSIZ
	AOS PAGES
	MOVSI I,-=498
	SETZM LINES
	POPJ P,
;CREATE, CREAT2, CTEXT

CREATE:	TRZ F,COPY
	SKIPN @DSTFIL
	JRST FLOSE
	PUSHJ P,COPCHK
;	LDB T,[1400,,DATBLK]		;MUST FIX ******
;	HRRM T,@DSTFIL+1
;	LDB T,[POINT 12,DATBLK,17]
;	DPB T,[POINT 12,@DSTFIL+2,35]
;	LDB T,[POINT 3,DATBLK,5]
;	DPB T,[POINT 3,@DSTFIL+1,20]

	HLLZS @DSTFIL+1			;Zero entire right half first
	LDB T,[POINT 12,DATBLK,17]	;Now get date
	DPB T,[POINT 12,@DSTFIL+1,35]	;and put it in right half
	LDB T,[POINT 15,DATBLK,17]	;Now get date
	DPB T,[POINT 15,@DSTFIL+1,35]	;and put it in right half
	MOVEI E,@DSTFIL
	PUSHJ P,OPENO
	SKIPE @DSTFIL+4
	JRST CREAT2
	MOVE A,[CTEXT,,OBUF]
	BLT A,OBUF+LCTEXT-1
	SETZM OBUF+LCTEXT
	MOVE A,[OBUF+LCTEXT,,OBUF+LCTEXT+1]
	BLT A,OBUF+377
	MOVSI A,(<BYTE(7)14>)
	MOVEM A,OBUF+200
	OUTPUT DSKO,[-400,,OBUF-1↔0]
CREAT2:	CLOSE DSKO,
	MOVE A,[DSTFIL,,SRCFIL]
	BLT A,SRCFIL+4
	POPJ P,

CTEXT:	ASCII/COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002
C00003 ENDMK
C⊗;
/
LCTEXT←←.-CTEXT
;RDSPA1,RDPAGE, RDPGOK, RDSPAG, RDPAG0

;Fixes up page info for the header and trailer lines
RDSPA1:	SKIPA T,CURPAG
RDSPA2:	MOVEI T,(A)		;Start with the page number
	PUSHJ P,NUMSTD		;Get ASCID equivalent
	MOVEM C,HEDPAG		;Put it on asterisk heading line
	MOVEM C,HED2PG		;and also on dash heading line
	MOVEM C,BOTPG2		;Deposit the page number
	MOVEM C,BOTPG4		;on both asterisk and dash bottom lines
	MOVE T,PAGES		;Now get the total number of pages
 	PUSHJ P,NUMSTD		;Get ASCID equivalent
	TRNN F,DIROK		;Is the directory OK?
	MOVE C,[375000,,1]	;No, so use ? mark with a space in ASCID
	MOVEM C,BOTPG3		;Deposit the total page count
	MOVEM C,BOTPG5		;on both types of bottom line
	POPJ P,

;Note skip return
RDPAGE:	TRZ F,UPDIR+WRITE+XPAGE+EDDIR
	SETZM FFLINE		;Used only with /F switch
	MOVSI I,-=498		;To count characters in lines
	SETZM RDLNGF		;Flag used in long line code
	MOVE B,A
	CAMGE A,DIRPAG
	HRRO A,DIRPAG
	CAMLE A,PAGES
	HRRO A,PAGES
	JUMPL A,RDPGLZ
	AOS (P)
RDPGOK:	CAMN A,FIRPAG
	JRST RDSPAG
	PUSHJ P,FNDPAG
	JUMPN T,.+2
	MOVEI T,DIR
	MOVSI TT,D1BIT
	IORM TT,2(T)
	EXCH T,DIRP1#
	JUMPE T,.+2
	ANDCAM TT,2(T)
	HRRZM A,FIRPAG
RDSPAG:	PUSHJ P,RDSPA2		;Update page info for header and trailer
	PUSHJ P,CLRWR2
	SETZM CHARS#
	SETZM ROOM
	SETZM RELPGN
	MOVE A,FIRPAG
RDPAG0:	SETZM LINES
	TRNE A,-2
	AOS CHARS	;FF ON MOST PAGES
	MOVE B,A
	PUSHJ P,FNDPAG
	MOVEM A,CURPAG
	MOVE D,T
	EXCH T,DIRPT#
	MOVSI TT,DPBIT
	JUMPE T,.+2
	ANDCAM TT,2(T)
	IORM TT,2(D)
	AOS TT,RELPGN#
	DPB TT,[RPBYTE+2(D)]
	MOVEI T,RLD
	MOVEM T,RLDA#
	CAMN B,DIRPAG
	JRST DRGSET
	JUMPE B,CPOPJ
	CAMLE B,PAGES
	POPJ P,
	MOVEI DSP,RPDSP
	SKIPN A,1(D)
	PUSHJ P,TELLZ
	PUSHJ P,SETI
;RDPAG2, RDPAG1, RDLINE, RDLLP, RDLTAB

	TRNE F,FILLUZ
	SKIPA T,[JSP Q,SOSTST]
RDPAG2:	MOVE T,[SETZB B,TT]
	MOVEM T,RDLINS#
	HRRZ T,(D)
	HRRZ T,1(T)
	SUBI T,(A)
	IMULI T,200*5
	ADDM T,ROOM#
	CAIG B,1
	JRST RDPAG1
	GETCHR
	CAIE C,14
	PUSHJ P,TELLD1
RDPAG1:	MOVSI H,LSPC+NSPEC
	PUSHJ P,ENDSET
	AOS T,A		;MAKE T +
	MOVE G,INPNT
	MOVEI D,PAGE#
	MOVSI E,440700
	HRRI E,LLDESC(A)	;SET UP FOR SSET2
	ILDB C,G
	SKIPGE CTAB(C)
	XCT @CTAB(C)
	DPB C,G		;IN CASE CLOBBERED BY SSET
	ADD G,[70000,,]
	CAIE C,12
	JRST RDLINE
	MOVEM G,NEWPNT
	SOS IBLK
	MOVE G,[441100,,[BYTE (9)15,200]]
RDLINE:	HRRM A,(D)
LEG	HRLZM D,(A)
RDLIN2:	MOVSI E,440700
	HRRI E,LLDESC(A)
	XCT RDLINS	;SETZB B,TT OR JSP Q,SOSTST
RDLLP:	GETCH2 H,G
RDLLP2:
LEG	IDPB C,E
	SKIPL T
	AOBJP I,LONGLN		;Test for too-long line
	AOJA B,RDLLP


RDLTAB:
LEG	IDPB C,E
	HRROI D,-10
	IORI D,(B)
	SUB B,D
	ADDI TT,(D)
	MOVEI T,40
	JRST .+11(D)
	REPEAT 10,<LEG	IDPB T,E>
LEG	IDPB C,E
	HRL D,D
	SUB I,D			;Add count of added spaces to I
	JUMPGE I,LONGLN		;Test for length
	AOJA TT,RDLLP

TELLD1:	SKIPE EDFIL-2
	POPJ P,			;NO warning if in /F
	PUSHJ P,TELLDZ
	ASCIZ /
DIRECTORY POINTER INVALID (NO PAGE MARK HERE) -- PROCEED WITH CAUTION
/
	
TELLDZ:	POP P,40
	OUTSTR @40
	SETOM TELFL2
	TRNE F,REDNLY
	POPJ P,			;Don't tellme if in readonly
	PUSHJ P,FBI
	JRST MACSTP		;Terminate macro expansion.
;RDLCR, RDLLF, NUMSTR,NUMSIX,OCTSTR,OCTASC

RDLCR0:	ADD G,[70000,,]
RDLCR1:	MOVEI C,15		;Long line code on page 124 enters here
RDLCR:	HRROI T,40
	JUMPN B,.+2
LEG	IDPB T,E
LEG	IDPB C,E
	GETCH2 H,G
RDLCR2:	ADD G,[70000,,]
	MOVEI C,12
RDLLF:	JUMPGE T,RDLCR0
LEG	IDPB C,E
	TDZA C,C
LEG	IDPB C,E
	TLNE E,760000
	JRST .-2
	CAIL B,1000-2
	JRST RDLONG
	AOS LINES
	MOVSI I,-=498
	ADDI TT,2(B)
	ADDM TT,CHARS
	DPB TT,[111100,,B]
	HRRZM B,1(A)
	AOS T,TXTNUM#
	MOVEM T,2(A)
	MOVEI D,(A)
	MOVNI E,1(E)
	ADDI E,LLDESC(A)
	HRLI A,(E)
	ADDI A,LLDESC+1
	MOVEI T,1
	IORM T,-1(A)
	AOBJN A,.-1
	MOVSI T,TXTCOD
	FSFIX A,T
	AOJA A,RDLINE

RDLONG:	MOVE T,LLDESC(A)
	CAME T,[ASCII /βββββ/]
	CAMN T,[ASCID /βββββ/]
	JRST RDLIN2
	FATAL LINE MORE THAN 511 CHARS

;Conversion routine for ASCII and ASCID
NUMSTD:	MOVEI C,1		;This entry used if ASCID is required
	MOVE A,[440700,,C]	;and results are left in C
NUMSTR:	IDIVI T,=10		;Converts to DEC ASCII, value in T, pointer in A
	JUMPE T,.+4		;Suppresses leading zeros
	HRLM TT,(P)
	PUSHJ P,NUMSTR
	HLRZ TT,(P)
	ADDI TT,"0"
	IDPB TT,A
	POPJ P,

OCTSTR:	JUMPGE T,.+4
	MOVEI TT,55
	IDPB TT,A
	MOVNS T
	IDIVI T,10		;Represents OCT in ASCII, value in T, pointer in A
	JUMPE T,.+4		;Suppresses leading zeros
	HRLM TT,(P)
	PUSHJ P,.-3
	HLRZ TT,(P)
	ADDI TT,"0"
	IDPB TT,A
	POPJ P,

OCTASC:	PUSH P,C		;Represents OCTAL in ASCII, all zeros shown
	MOVEI C,14		;Value in TT, pointer in A
	MOVEI T,0
	LSHC T,3		
	ADDI T,"0"
	IDPB T,A
	SOJG C,.-4
	POP P,C
	POPJ P,

NUMSIX:	IDIVI T,=10		;Produces six-bit representation of DEC. value
	JUMPE T,.+4
	HRLM TT,(P)
	PUSHJ P,NUMSIX
	HLRZ TT,(P)
	ADDI TT,'0'
	IDPB TT,A
	POPJ P,

;RDLFF, RDLDON, LINSET, RPDSP, RDLNUL

RDLFF:
;	JUMPN B,RDLFF2
	TRNE B,777777		;Replaces JUMPN B,RDLFF2 since left of B is used
	JRST RDLFF2
RDLDON:	HRRZS CHARS
	PUSHJ P,ENDFIX
	HRLM D,BOTSTR
	MOVEI T,BOTSTR
	HRRM T,(D)
	MOVEM G,INPNT
	TRNN F,EDDIR
	PUSHJ P,DIRCHK
	TRNE F,FILLUZ
	PUSHJ P,INSDIR
	PUSHJ P,SETWR3		;Compute bloat number
LINSET:	MOVE T,LINES
	CAMGE T,ARRL
	TLOA F,OFFEND
	TLZ F,OFFEND
	SUB T,SCRSIZ
	ADDI T,3
	ADD T,EXTRA
	JUMPG T,.+3
	MOVEI T,1
	SETOM BOTWIN
	EXCH T,WINMAX#
	CAMN T,WINMAX
	CAIG T,1
	SETOM BOTWIN
	POPJ P,

RDLFF2:	MOVEI C,15
LEG	IDPB C,E
	JRST RDLCR2

;Main dispatch table for testing characters while reading in a page of text
	PUSHJ P,RLD1
RPDSP:	JSP C,RDLNUL
	PUSHJ P,@RLDA
	JUMPGE T,RDLCR
	JRST RDLLF
	JUMPGE T,RDLTAB
	JUMPGE T,RDLFF
	MOVEI C,"}"

repeat 1,<
;Dispatch table to test the characters after finding a pseudp FF position
	PUSHJ P,RLD1
RPDSP2:	JSP C,RDLNUL
	PUSHJ P,@RLDA
	JFCL			;CR
	JFCL			;LF
	JFCL			;TAB
	JUMPGE T,SOSTS2		;A real FF here so restore DSP and proceed normally
	MOVEI C,"}"
>

RDLNUL:	SKIPE (G)
	JRST -3(C)
	HRLI G,700
	SKIPN 1(G)
	AOJA G,.-1
	JRST -3(C)
;RDPGLZ, SOSTST, SOSCHK, SOSCK2, PGMK, PGMK2

RDPGLZ:	ANDI A,-1
	TRNE F,DIROK
	JRST RDPGOK
	PUSH P,B
	PUSHJ P,RDPGOK
	PUSHJ P,FLSPAG
	POP P,A
	JRST RDPAGE

SOSTST:	SETZB B,TT
	MOVSI I,-=498		;Stop at 498 characters
	AOS C,FFLINE		;Get updated line count
	SKIPE EDFIL-2		;Are we in /F mode?
	CAMG C,EDFIL-2		;Are there enough lines on this page?
	JRST SOSCHK		;not time for pseudo FF
	SETZM FFLINE
	MOVEI DSP,RPDSP2	;Special dispatch table on page 126
	GETCH2 H,G
	MOVEI C,14
	ADD G,[70000,,0]
	JUMPGE G,.+2
	SUB G,[430000,,1]
SOSTS2:	SKIPA DSP,[RPDSP]	;Reset usual dispatch but don't pick up character.
;The above SKIPA skips over the first instruction GETCH2 expands to (ILDB C,G).
SOSCHK:	GETCH2 H,G
SOSCK2:	PUSH P,T
	MOVEI T,1
	AOS SOSBIN		;To count total references to SOSCK2
	TDNN T,(G)
	JRST [ POP P,T ↔ JRST 3(Q)]
	POP P,T
	MOVE C,(G)
	CAMN C,[ASCID /     /]
	JRST PGMK
	AND C,[BYTE (7)160,160,160,160,160(1)1]
	CAME C,[ASCID /00000/]
	JRST [AOS SOSLI2↔JRST 2,@[20000,,(Q)]]
	AOS SOSLIN
	AOJA G,.+2
	IBP G
	SKIPGE (G)
	PUSHJ P,RLD
	JRST (Q)

PGMK:	HRLI G,10700
	AOS SOSPAG		;To count SOS pages
	SKIPGE (G)
	PUSHJ P,RLD
PGMK2:	ILDB C,G
	CAIN C,14
	JRST @5(DSP)
	CAIN C,15
	JRST PGMK2
	JRST 1(Q)
;DIRCHK, DIRNEW, DIRNW2, DIRNW1, TXTSHF

DIRCHK:	MOVE A,INPNT
	SUB A,IBFPNT
	ADD A,[70000,,]
	JUMPGE A,.+2
	SUB A,[XOR 1]
	ROT A,-7
	HRR A,IBLK
	HRRZ E,@DIRPT
	SKIPN 1(E)
	JRST DIRNEW
	CAME A,1(E)
	PUSHJ P,TELLD2
;	CAME A,1(E)
;	PUSHJ P,MAP		;Report storage map in this case
	POPJ P,

TELLD2:	PUSHJ P,TELLDZ	;On page 124, reports message, calls FBI, pops back above
	ASCIZ /
** DIRECTORY TROUBLE! **  If wrong page shows, DO NOT edit this page.
  Give command to switch to page number shown at top.
/
;	ASCIZ /
; NEXT DIRECTORY POINTER INVALID -- PROCEED WITH CAUTION
; /

DIRNEW:	TRNN F,EOF
	JRST DIRNW1
	TRO F,DIROK
DIRNW2:	MOVEM A,1(E)
	POPJ P,

DIRNW1:	MOVE T,DIRPT
	CAIE E,DIREND
	JRST DIRNW2
	PUSHJ P,DIRADD
	JRST DIRCHK

TXTSHF:	PUSHJ P,LSTSHF
	MOVE T,2(A)
	TLNE T,ARRBIT
	ADDM C,ARRLIN
	TLNE T,WINBIT
	ADDM C,WINLIN
	JUMPGE T,CPOPJ
	ADDI A,LLDESC+LPMTXT
	MOVE T,1(A)
	TRNN T,-1
	HRRI T,XPLSTE
	PUSHJ P,LSTSH1
	SUBI A,LLDESC+LPMTXT
	POPJ P,
;FNDLIN, FNDPAG, FNDLN1, FNDLN2, FNDLN3

FNDPAG:	MOVE T,ARRL
	HRL T,CURPAG
	CAME A,CURPAG
	MOVEM T,LSTPLC#			;Remember page and line we came from.
	SKIPA T,[DPTRTB,,DPTRT2]
FNDLIN:	MOVE T,[LPTRTB,,LPTRT2]
	HLRM T,FNDPT1
	HRRM T,FNDPT2
	MOVE T,-1(T)
	HRLOI TT,377777
	MOVEM TT,FNDTM1#
FNDLN1:	MOVEI TT,(A)
	SUB TT,@FNDPT1
	MOVM TT,TT
	CAMGE TT,FNDTM1
	SKIPN @FNDPT2	;IGNORE IF PNTR NOT SET
	AOBJN T,FNDLN1
	JUMPGE T,FNDLN2
	MOVEM TT,FNDTM1
	MOVEM T,FNDTM2#
	AOBJN T,FNDLN1
FNDLN2:	MOVE T,FNDTM2
	MOVEI TT,(A)
	SUB TT,@FNDPT1
	ADD T,FNDPT2
	XCT (T)
	JUMPE TT,CPOPJ
	SETZM FNDPAD#		;Fndpag direction for TELLME
	JUMPL TT,FNDLN3
	SETOM FNDPAD		;Ditto
	HRRZ T,(T)
	SOJG TT,.-1
	POPJ P,

FNDLN3:	HLRZ T,(T)
	AOJL TT,.-1
	POPJ P,
;REMPTR FIXPTR FNDPT1 FNDPT2 LPTRTB DPTRTB ARRL TOPWIN LINES FIRPAG CURPAG PAGES

;This AND's the complement of ARRBIT into the left half of (location  in ARRLIN)+1 
;  if ARRLIN is non-zero and sets ARRLIN to zero
;Also AND's the complement of WIMBIT into the left half of (location in WINLIN)+1
;  if WINLIN is non-zero and sets WINLIN to zero.
REMPTR:	FOR @! X IN(ARR,WIN)
{	MOVSI TT,X!BIT
	SKIPE T,X!LIN
	ANDCAM TT,1(T)
	SETZM X!LIN
}	POPJ P,

;This fixes the pointers in the data for the line in question
;  The location in ARRL is used by FINLIN to update ARRLIN and to compute the
;  value which is ORed into the location 1 beyond that in ARRLIN.
;  The location in WINL is similarly used to update WINLIN and to compute the
;  value which is ORed into the location 1 beyond that in WINLIN.
FIXPTR:	FOR @! X IN(ARR,WIN)
{	MOVE A,X!L
	PUSHJ P,FNDLIN
	MOVEM T,X!LIN
	MOVSI TT,X!BIT
	IORM TT,1(T)
}	POPJ P,

IMPURE
FNDPT1:	(T)
FNDPT2:	@(T)

LPTRTB←←.
ARRL:	0
TOPWIN:	0
	1
LINES:	0
	LPTRTB-.,,
LPTRT2:	HRRZ T,ARRLIN
	HRRZ T,WINLIN
	HRRZ T,PAGE
	HLRZ T,BOTSTR

WINL←←TOPWIN		;FOR FIXPTR

DPTRTB←←.
CURPAG:	0		;Number of last in-core page (usually same as FIRPAG)
FIRPAG:	0		;Number of first in-core page
	1
PAGES:	0		;Number of last page in the file
	DPTRTB-.,,
DPTRT2:	HRRZ T,DIRPT
	HRRZ T,DIRP1
	HRRZ T,DIR
	HLRZ T,DIREND
PURE
;DIRGET, DIRGL, DGEND, DRGSET

DIRGET:	HRRZ T,DIR
	MOVEM T,DIRGPT#	;BETTER THE HELL NOT CAUSE SHUFFLAGE
	SETZM DIRGPG#
	MOVE C,[170700,,DIRHED+3]
	MOVEM C,INPNT
	MOVE C,PAGES
	PUSHJ P,NUM5
	MOVE C,[440700,,DIRHED]
	JSP Q,RLDX
	SKIPE VBUF
	SKIPA C,[440700,,VBUF]
	MOVE C,[440700,,[BYTE (7)15,12,177]]
	JSP Q,RLDX
	MOVE C,[440700,,DIRHD2]
DIRGL:	JSP Q,RLDX
	MOVE C,[350700,,DIRTXT]
	MOVEM C,INPNT
	MOVE C,DIRGPT
	HRRZ C,1(C)
	PUSHJ P,NUM5
	IBP INPNT
	AOS C,DIRGPG
	CAMLE C,PAGES
	JRST DGEND
	PUSHJ P,NUM5
	MOVE C,[440700,,DIRTXT]
	JSP Q,RLDX
	HRRZ C,DIRGPT
	HRRZ Q,(C)
	MOVEM Q,DIRGPT
	ADD C,[440700,,LPDESC]
	JRST DIRGL

DGEND:	MOVEI C,177
	IDPB C,INPNT
	TRNN F,DIROK
	SKIPA C,[440700,,DIRUNK]
	MOVE C,[440700,,DIRTXT]
	JSP Q,RLDX
	MOVE C,[440700,,DIREMK]
	JSP Q,RLDX
	SUB P,[1,,1]
	XCT -1(DSP)

DRGSET:	MOVEI Q,DIRGET
	TRO F,EDDIR
	MOVEI DSP,DGDSP
	PUSHJ P,SETRLD
	MOVEI A,1
	JRST RDPAG2